/*
 * Copyright 2002-2007 the original author or authors.
 *
 * Licensed under the Apache license, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.internna.iwebjtracker.server;

import java.util.Set;
import org.internna.iwebjtracker.server.connection.ConnectionDetails;
import org.internna.iwebjtracker.server.connection.ServerConnection;

/**
 * Basic skeleton to represent any kind of server that listens using incoming sockets.
 *
 * @author Jose Noheda
 * @since 1.0
 * @param T type of connections supported
 */
public interface Server<T extends ServerConnection, C extends ConnectionDetails> {

    /**
     * 
     * @param connectionDetails data required to find the server and authenticate
     * @return an open connection to this type of server.
     */
    T openConnection(C connectionDetails);

    /**
     * Closes a previously opened connection.
     */
    void closeConnection(T connection);

    /**
     * Checks if this connection values are valid and the server is reachable from this location.
     */
    boolean testConnection(C connectionDetails);

    /**
     * The network protocols this type of server can use.
     */
    Set<String> getSupportedProtocols();

    /**
     * Identifies the type of server.
     */
    String getServerType();

}
